home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Just Call Me Internet
/
Just Call Me Internet.iso
/
prog
/
atari
/
c
/
du_lib
/
popup.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-10
|
6KB
|
272 lines
/*
DU_LIB v2
Gem Window Management & Dialog Library For Lattice C
½1994, by Craig Graham.
Based on the DU_LIBv1 Library for HiSoft Basic.
*/
/*
Popup Menu Handler
*/
#include "dulib.h"
#include <string.h>
/*
Side-pointing arrow (OSF Motif style) for popups
*/
MFORM SIDEARRW =
{ 0x0001,0x0007,0x0002,0x0000,0x0001,
/* Mask data */
0x0000,0x0000,0x0600,0x0E00,
0x1E00,0x3FFC,0x7FF4,0xFFF4,
0x7FF4,0x3FFC,0x1E00,0x0E00,
0x0600,0x0000,0x0000,0x0000,
/* Cursor data */
0x0000,0x0000,0x0000,0x0400,
0x0C00,0x1C00,0x3FF8,0x7FF8,
0x3FF8,0x1C00,0x0C00,0x0400,
0x0000,0x0000,0x0000,0x0000
};
/*Form an <n> entry pop-up menu for <object> in <dialog>, and return a selection from it.*/
short form_popup(short dialog,short object, short n, short current, char *t[])
{
static OBJECT popup[50];
static TEDINFO texts[30];
OBJECT* l;
OBJECT* lt;
TEDINFO* ltb;
MFDB scr,obm;
short p[8];
short *buf;
short mb,a,max_w,f;
GRECT oxywh;
short rtn;
short c,e,mx,my,dummy,ex_f,sel_f;
graf_mkstate(&mx,&my,&sel_f,&junk);
if (sel_f) sel_f=TRUE; else sel_f=FALSE;
vs_clip(x_handle, 0, NULL);
rsrc_gaddr(0,dialog,&l);
objc_xywh(l,object,&oxywh);
if (n==0)
{
rtn=0;
} else {
popup->ob_next=-1; /*Create a popup menu structure*/
popup->ob_head=1;
popup->ob_tail=n+1;
popup->ob_flags=0;
popup->ob_state=mask_shadowed;
popup->ob_type=G_BOX;
#ifdef __USE_GNU
popup->ob_spec=(unsigned long)70128;
#else
popup->ob_spec=(OBJECT*)70128;
#endif
max_w=1;
lt=popup; ltb=texts;
for(f=0; f<(n+1); f++)
{
a=strlen(t[f]);
if (a>max_w) { max_w=a; }
}
if (oxywh.g_w<max_w*8+10) { oxywh.g_w=max_w*8+10; }
if (oxywh.g_x+oxywh.g_w+5>scrn_x+scrn_w) { oxywh.g_x=scrn_x+scrn_w-oxywh.g_w-5; }
if (oxywh.g_y+(n+1)*16+24>scrn_y+scrn_h) { oxywh.g_y=scrn_y+scrn_h-((n+1)*16+24); }
for(f=1;f<(n+1);f++)
{
lt++;
lt->ob_next=f+1;
lt->ob_head=-1;
lt->ob_tail=-1;
lt->ob_flags= mask_selectable | mask_exit | mask_rbutton;
if (f==current) /*Highlight the current selection*/
{
lt->ob_state=mask_selected;
lt->ob_flags=mask_selectable | mask_exit | mask_rbutton | mask_default;
} else {
lt->ob_state=0;
}
lt->ob_type=G_TEXT;
lt->ob_x=5;
lt->ob_y=f*16+10;
lt->ob_width=oxywh.g_w-10;
lt->ob_height=16;
#ifdef __USE_GNU
lt->ob_spec=(unsigned long)ltb;
#else
lt->ob_spec=(OBJECT*)ltb;
#endif
ltb->te_ptext=t[f];
ltb->te_ptmplt=t[f];
ltb->te_pvalid=t[f];
ltb->te_font=3;
ltb->te_just=0;
ltb->te_color=4464;
ltb->te_tmplen=ltb->te_txtlen=strlen(t[f])+1;
ltb++;
}
lt++;
lt->ob_type=G_BOX;
lt->ob_next=0;
lt->ob_head=n+2;
lt->ob_tail=n+2;
lt->ob_flags=0;
lt->ob_state=0;
lt->ob_type=G_BOX;
lt->ob_x=0;
lt->ob_y=0;
lt->ob_width=oxywh.g_w;
lt->ob_height=18;
#ifdef __USE_GNU
lt->ob_spec=(unsigned long)70129;
#else
lt->ob_spec=(OBJECT*)70129;
#endif
lt++;
lt->ob_next=n+1; /*Current Selection Text*/
lt->ob_head=-1;
lt->ob_tail=-1;
lt->ob_flags=LASTOB;
lt->ob_state=0;
lt->ob_type=G_TEXT;
lt->ob_x=5;
lt->ob_y=1;
lt->ob_width=oxywh.g_w-10;
lt->ob_height=16;
#ifdef __USE_GNU
lt->ob_spec=(unsigned long)ltb;
#else
lt->ob_spec=(OBJECT*)ltb;
#endif
ltb->te_ptext=t[0];
ltb->te_ptmplt=t[0];
ltb->te_pvalid=t[0];
ltb->te_font=3;
ltb->te_just=0;
ltb->te_color=4208;
ltb->te_tmplen=ltb->te_txtlen=strlen(t[current])+1;
popup->ob_x=oxywh.g_x;
popup->ob_y=oxywh.g_y;
popup->ob_width=oxywh.g_w;
popup->ob_height=(n+1)*16+18;
buf=(short*)malloc(((scrn_planes*(popup->ob_width+8))/4)*(popup->ob_height+8));
if (buf)
{
scr.fd_addr=NULL;
graf_mouse(M_OFF,NULL);
obm.fd_addr=buf;
obm.fd_w=popup->ob_width+6;
obm.fd_h=popup->ob_height+6;
obm.fd_wdwidth=(short)(obm.fd_w/8);
obm.fd_stand=1;
obm.fd_nplanes=scrn_planes;
p[0]=popup->ob_x; p[1]=popup->ob_y;
p[2]=p[0]+popup->ob_width+2; p[3]=p[1]+popup->ob_height+2;
p[4]=p[5]=1;
p[6]=p[4]+popup->ob_width+2; p[7]=p[5]+popup->ob_height+2;
wind_update(BEG_UPDATE);
vro_cpyfm(x_handle,S_ONLY,p,&scr,&obm);
}else{
form_alert(1,"[3][ | DULIB GUI ERROR: | Out of memory for popup menu | background buffering. ][ Cancel ]");
return current;
}
objc_draw(popup,0,5,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20);
graf_mouse(M_ON,NULL);
wind_update(BEG_MCTRL);
ex_f=rtn=0; c=current;
graf_mouse(USER_DEF,&SIDEARRW);
while (!ex_f) {
if (sel_f)
{
#ifndef __USE_GNU
e=evnt_multi(MU_KEYBD|MU_BUTTON|MU_M1|MU_TIMER, 1, 1, 1, 1, mx, my, 1, 1,0,0,0,0,0,
messB,100,0,&mx,&my,&mb,&dummy,&dummy,&dummy);
#else
e=evnt_multi(MU_KEYBD|MU_BUTTON|MU_M1|MU_TIMER, 1, 1, 1, 1,mx,my,1,1,0,0,0,0,0,
messB,100,&mx,&my,&mb,&dummy,&dummy,&dummy);
#endif
}else{
#ifndef __USE_GNU
e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1, mx, my, 1, 1,0,0,0,0,0,
messB,100,0,&mx,&my,&mb,&dummy,&dummy,&dummy);
#else
e=evnt_multi(MU_BUTTON|MU_M1, 1, 1, 1, 1,mx,my,1,1,0,0,0,0,0,
messB,100,&mx,&my,&mb,&dummy,&dummy,&dummy);
#endif
if ((e&MU_BUTTON)==0) graf_mkstate(&mx,&my,&mb,&junk);
}
rtn=objc_find(popup,0,1,mx,my);
if ((rtn>n)||(rtn<1)) rtn=current;
if (rtn!=c)
{
if (c)
objc_change(popup,c,0,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20, 0, 1);
c=rtn;
if (c)
objc_change(popup,c,0,oxywh.g_x,oxywh.g_y,oxywh.g_w+5,(n+1)*16+20, mask_selected, 1);
}
if ((sel_f==FALSE)&&(mb==1))
ex_f=1;
if ((sel_f==TRUE)&&(mb==0))
ex_f=1;
}
graf_mouse(ARROW,NULL);
graf_mouse(M_OFF,NULL);
scr.fd_addr=NULL;
p[0]=p[1]=1;
p[2]=p[0]+popup->ob_width+2; p[3]=p[1]+popup->ob_height+2;
p[4]=popup->ob_x; p[5]=popup->ob_y;
p[6]=p[4]+popup->ob_width+2; p[7]=p[5]+popup->ob_height+2;
vro_cpyfm(x_handle,S_ONLY,p,&obm,&scr);
graf_mouse(M_ON,NULL);
free(buf);
wind_update(END_MCTRL);
wind_update(END_UPDATE);
}
do {
graf_mkstate(&junk,&junk,&mb,&junk);
} while (mb!=0);
return rtn;
}